#ifndef ARBRE_EVALUATION_H_INCLUDED
#define ARBRE_EVALUATION_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "symbole.h"
#include "struct.h"

// Opérateurs
#define OP_PLUS 0
#define OP_MOINS 1
#define OP_MULTI 2
#define OP_DIV 3
#define OP_MOD 4
#define OP_SUP 5
#define OP_INF 6
#define OP_SUPEGAL 7
#define OP_INFEGAL 8
#define OP_EGALEGAL 9
#define OP_NONEGAL 10
#define OP_AND 11
#define OP_OR 12

// Fonction
#define FCT_GRILLE 0
#define FCT_FLEUR 1
#define FCT_ENNEMIE 2
#define FCT_ESTLIBRE 3
#define FCT_NECTAR 4
#define FCT_DISTANCE 5

typedef struct arbre{
	struct noeud * n;
	struct feuille * f;
}arbre;

typedef struct fonction{
	int type;
	struct arbre * param1;
	struct arbre * param2;
	struct arbre * param3;
	struct arbre * param4;
}fonction;

typedef struct feuille{
	struct fonction * fonction;
	struct symbole * variable;
	int val;
}feuille;

typedef struct noeud{
	int operateur; // O : +, 1 : -, 2 : *, 3 : /, 4 : %
	struct arbre * fg;
	struct arbre * fd;
}noeud;


arbre creer_arbre();
arbre creer_arbre_valeur(int);
arbre creer_arbre_operateur(int,int,int);
void affiche_arbre(arbre *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
void affiche_feuille(feuille *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES] );
void affiche_noeud(noeud *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
void affiche_fonction(fonction *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
void affiche_variable(struct symbole *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
int evaluer_arbre(arbre *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
int evaluer_feuille(feuille *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
int evaluer_noeud(noeud *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
int evaluer_fonction(fonction *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
int evaluer_variable(struct symbole *, abeille *, fleur **, case_t[NB_COL][NB_LIGNES]);
;
#endif
